不等式
Time Limit: 10 Sec Memory Limit: 128 MB
Description
小z热衷于数学。
今天数学课的内容是解不等式:L<=Sx<=R 。小z心想这也太简单了,不禁陷入了深深的思考:假如已知L,R,S,M ,满足L<=(Sx) mod M<=R 的最小正整数x该怎么求呢?
第一行包含一个整数T,表示数据组数,接下来是T行,每行为四个正整数M, S, L, R 。
Output
对于每组数据,输出满足要求的x值,若不存在,输出-1 。
1
5 4 2 3
Sample Output
2
HINT
30%的数据中保证有解并且答案小于等于10^6;
另外20%的数据中保证L=R;
100%的数据中T<=100,M, S, L, R<=10^9。
Solution
Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| #include<bits/stdc++.h> using namespace std; typedef long long s64;
const int ONE = 300005; const int MOD = 1e9 + 7;
int T; s64 M, S, L, R;
int get() { int res=1,Q=1;char c; while( (c=getchar())<48 || c>57 ) if(c=='-')Q=-1; res=c-48; while( (c=getchar())>=48 && c<=57 ) res=res*10+c-48; return res*Q; }
s64 Dfs(s64 M, s64 S, s64 L, s64 R) { if(L > R || M < L) return -1;
S %= M; int res = (L - 1)/S + 1; if(res * S <= R) return res;
int l = (-R % S + S) % S, r = (-L % S + S) % S; int y = Dfs(S, M, l , r); if(y == -1) return -1;
int x = (R + M * y) / S; if(L <= S * x - M * y) return x; return -1; }
int main() { T = get(); while(T--) { M = get(); S = get(); L = get(); R = get();
printf("%d\n", Dfs(M, S, L, min(R, M-1))); }
}
|